package br.edu.ufcg.dsc.lp2.projeto.tests.model;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.Assert;

import br.edu.ufcg.dsc.lp2.projeto.model.Estabelecimento;
import br.edu.ufcg.dsc.lp2.projeto.model.Ordena;
import br.edu.ufcg.dsc.lp2.projeto.model.PopularidadeGlobal;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.EnderecoInvalidoException;

public class OrdenaTest {
	

	@Before
	public void setUp() throws EnderecoInvalidoException {
		estabelecimentos = new ArrayList<Estabelecimento>();

		e1 = new Estabelecimento("Girassol",
				"R Irineu Joffily 263 - Centro", "A la carte");

		e2 = new Estabelecimento("Baixinho Bar e Restaurante",
				"Rua papa João XXIII, 101, Liberdade", "A la carte");

		e3 = new Estabelecimento("Cantina da Sayonara",
				"Campus da UFCG, praça do bloco BD", "Prato feito");

		e4 = new Estabelecimento("Super China Restaurante",
				"Shopping Luiza Mota", "Self-service");

		e5 = new Estabelecimento("Spolleto", "Shopping Boulevard",
				"A la carte");

		// adiciona votos
		e1.votar(-1);
		e1.votar(-1);
		e1.votar(-1);
		e1.votar(-1);

		e2.votar(-1);
		e2.votar(0);
		e2.votar(5);

		e3.votar(0);

		e4.votar(4);
		e4.votar(5);

		e5.votar(5);
		e5.votar(5);
		e5.votar(5);

		// adiciona a lista
		estabelecimentos.add(e1);
		estabelecimentos.add(e2);
		estabelecimentos.add(e3);
		estabelecimentos.add(e4);
		estabelecimentos.add(e5);
		
		estabelecimentos = PopularidadeGlobal.retorna("5", estabelecimentos);
		
		// Antes de ordenar
		Assert.assertEquals(15, estabelecimentos.get(0).getPopularidade());
		Assert.assertEquals(9, estabelecimentos.get(1).getPopularidade());
		Assert.assertEquals(4, estabelecimentos.get(2).getPopularidade());
		Assert.assertEquals(0, estabelecimentos.get(3).getPopularidade());
		Assert.assertEquals(-4, estabelecimentos.get(4).getPopularidade());
	}

	@Test
	public void testOrdenaOrdemAlfabetica() {
		
		Ordena.ordemAlfabetica(estabelecimentos);

		// Depois de ordenar
		Assert.assertEquals("Baixinho Bar e Restaurante", estabelecimentos.get(0).getNome());
		Assert.assertEquals("Cantina da Sayonara", estabelecimentos.get(1).getNome());
		Assert.assertEquals("Girassol", estabelecimentos.get(2).getNome());
		Assert.assertEquals("Spolleto", estabelecimentos.get(3).getNome());
		Assert.assertEquals("Super China Restaurante", estabelecimentos.get(4).getNome());
	}
	
	@Test
	public void testOrdemTipoDeAlmoco() {
		
		Ordena.ordemTipoDeAlmoco(estabelecimentos);

		// Depois de ordenar
		Assert.assertEquals("A la carte", estabelecimentos.get(0).getTipoDeAlmoco());
		Assert.assertEquals("A la carte", estabelecimentos.get(1).getTipoDeAlmoco());
		Assert.assertEquals("A la carte", estabelecimentos.get(2).getTipoDeAlmoco());
		Assert.assertEquals("Prato feito", estabelecimentos.get(3).getTipoDeAlmoco());
		Assert.assertEquals("Self-service", estabelecimentos.get(4).getTipoDeAlmoco());
	}
	
	@Test
	public void testOrdemPopularidadeGlobal() {
		// Como a lista ja foi ordenada no setUp, vou ordenar de outra forma
		// e depois ordenar por popularidade global.
		
		Ordena.ordemAlfabetica(estabelecimentos);
		
		// E agora ordenando por popularidade
		Ordena.ordenaPopularidadeMaiores(estabelecimentos);
		
		Assert.assertEquals(15, estabelecimentos.get(0).getPopularidade());
		Assert.assertEquals(9, estabelecimentos.get(1).getPopularidade());
		Assert.assertEquals(4, estabelecimentos.get(2).getPopularidade());
		Assert.assertEquals(0, estabelecimentos.get(3).getPopularidade());
		Assert.assertEquals(-4, estabelecimentos.get(4).getPopularidade());
	}
	
	
	private Estabelecimento e1, e2, e3, e4, e5;
	private List<Estabelecimento> estabelecimentos;

}
